package com.xjm.api.admin;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xjm.constant.Add;
import com.xjm.constant.Update;
import com.xjm.entity.dto.AdminDto;
import com.xjm.entity.dto.LoginDto;
import com.xjm.entity.model.AdminModel;
import com.xjm.entity.vo.AdminVo;
import com.xjm.entity.vo.LoginAdminVo;
import com.xjm.entity.vo.PageVo;
import com.xjm.entity.vo.Result;
import com.xjm.service.AdminService;
import com.xjm.service.CodeService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/admin")
@RequiredArgsConstructor
//管理员登录
public class AdminController {

    private final CodeService codeService;

    private final AdminService adminService;


    /**
     * 管理员登录
     *
     * @param loginDto 管理员登录信息
     * @return 登陆成功的信息
     */
    @PostMapping("/login")
    public Result<LoginAdminVo> login(@Validated @RequestBody LoginDto loginDto) {
        if (!codeService.checkCode(loginDto.getSign(), loginDto.getCode())) {
            return Result.error("验证码错误或已过期");
        }
        return Result.success(adminService.login(loginDto.getAccount(), loginDto.getPassword()));
    }

    /**
     * 获取验证
     *
     * @return 验证码
     */
    @GetMapping("/getCode")
    public Result<JSON> getCode() {
        return Result.success(codeService.getSimpleCode());
    }

    /**
     * 获取管理员列表
     *
     * @param page 页码
     * @param size 每页条数
     * @return 管理员列表
     */
    @GetMapping("/getAdmin")
    public Result<PageVo<AdminVo>> getAdmin(
            @RequestParam(defaultValue = "1") Long page,
            @RequestParam(defaultValue = "5") Long size
    ) {
        IPage<AdminModel> paged = adminService.page(new Page<>(page, size));

        PageVo<AdminVo> pageVo = new PageVo<>(page, size);
        pageVo.setList(BeanUtil.copyToList(paged.getRecords(), AdminVo.class));
        pageVo.setTotal(paged.getTotal());
        pageVo.setCurrentPage(paged.getCurrent());
        pageVo.setPageSize(paged.getSize());

        return Result.success(pageVo);
    }

    /**
     * 添加管理员
     */
    @PostMapping("/addAdmin")
    public Result<Void> addAdmin(@Validated(Add.class) @RequestBody AdminDto adminDto) {
        if (adminService.addAdmin(adminDto)) {
            return Result.success("新增管理员成功");
        }
        return Result.error("新增管理员失败");
    }

    /**
     * 更新管理员
     */
    @PostMapping("/updateAdmin")
    public Result<Void> updateAdmin(@Validated(Update.class) @RequestBody AdminDto adminDto) {
        if (adminDto.getId() == 1) {
            adminDto.setPassword(null);
        }
        if (adminService.updateAdmin(adminDto)) {
            return Result.success("更新管理员成功");
        }
        return Result.error("更新管理员失败");
    }

    /**
     * 删除管理员
     *
     * @param id 管理员id
     */
    @GetMapping("/deleteAdmin/{id}")
    public Result<Void> deleteAdmin(@PathVariable("id") Integer id) {
        if (id == 1) {
            return Result.error("超级管理员不能删除");
        }
        if (adminService.deleteAdmin(id)) {
            return Result.success("删除管理员成功");
        }
        return Result.error("删除管理员失败");
    }

    /**
     * 获取用户详细信息
     *
     * @param id 用户实体类
     * @return 查询结果
     */
    @GetMapping("/getAdminById/{id}")
    public Result<AdminVo> getAdminByCondition(@PathVariable("id") Integer id) {
        return Result.success(adminService.getAdminById(id));
    }
}
